/**
 * Copyright(c) 2013 Jade Techonologies, Ltd.
 *
 * History:
 *   2011-5-25 14:52:34 Created by sky
 */
package com.jade.bss.base.customer;

import java.util.Date;
import java.util.List;

import com.jade.framework.base.criterion.Criteria;
import com.jade.framework.base.util.PagingList;

/**
 * 客户的数据访问接口，包括新增、删除、修改以及查询等操作。
 *
 * @author sky
 * @version 1.0 2011-5-25 14:52:34
 */
public interface CustomerDao
{
    /**
     * 添加一个客户
     *
     * @param customer 客户对象
     * @return 客户标识
     */
    long addCustomer(Customer customer)
            throws CustomerException;

    /**
     * 批量删除个人客户
     *
     * @param customer 客户标识数组
     */
    void removeCustomer(Customer customer)
            throws CustomerException;

    /**
     * 根据客户标识获取客户信息
     * <p/>
     * 如果客户不存在，返回null
     *
     * @param id 客户标识
     * @return 客户对象
     */
    Customer getCustomer(long id);

    /**
     * 根据域标识和名称来查找客户.
     *
     * @param type 客户类型                                y
     * @param name     客户名称.
     * @return 返回匹配的客户
     */
    public Customer getCustomer(String type, String name);

    /**
     * 修改客户基本资料信息，不包括密码、类型等信息。同时也不包括 domainId, agentId。
     *
     * @param customer 客户资料
     */
    void updateCustomer(Customer customer)
            throws CustomerException;

    /**
     * 查询客户的信息,获取客户列表。infoClasses表示要获取的扩展信息类，为null或者空将不获取扩展信息类型。
     * Criteria条件中各个项的名称必须为 customer.name 或者 latestLoginInfo.name 这种格式。
     *
     * @param criteria 参数
     * @return 客户列表
     */
    PagingList<Customer> queryCustomer(Criteria criteria);

    /**
     * 查询客户的信息,获取客户列表.
     *
     * @param criteria 查询条件
     * @param infos    客户扩展信息
     * @return 客户列表
     */
    PagingList<Customer> queryCustomer(Criteria criteria, Class... infos);

    /**
     * 根据距离排序来查询客户的信息,获取客户列表。infoClasses表示要获取的扩展信息类，为null或者空将不获取扩展信息类型。
     * 此方法仅针对带有EnterpriseInfo扩展信息的客户。
     *
     * @param criteria    参数
     * @param infos 扩展信息类
     * @return 客户列表
     */
    public PagingList<Customer> querySortDistance(double lat, double lng, double distance, Criteria criteria, Class... infos);

    /**
     * 获取客户扩展信息。
     *
     * @param customerId 客户标识
     * @param infoClass  扩展信息对象类。
     * @return 客户信息对象
     */
    public <Info extends CustomerInfo> Info getInfo(long customerId, Class infoClass);

    /**
     * 新增客户扩展信息。
     *
     * @param info 客户信息对象
     */
    public void addInfo(CustomerInfo info)
            throws CustomerException;

    /**
     * 更改客户扩展信息。
     *
     * @param info 客户信息对象
     */
    public void updateInfo(CustomerInfo info)
            throws CustomerException;

    /**
     * 删除客户扩展信息。
     *
     * @param info 扩展信息
     */
    public void removeInfo(CustomerInfo info)
            throws CustomerException;

    /**
     * 根据类型获取客户数量。
     *
     * @param type 客户类型
     * @return 客户数量
     */
    public long getCustomerCountByType(String type);

    //List<String> listTopTag(int length);
    public List<String> listTopTag(Criteria criteria);

    public long getUserCount(Date beginDate,Date endDate,String type);

}
